﻿using Logging.LogBDD;
using Logging.LogCSV;
using Logging.LogTXT;
using Logging.LogXML;
using Logging.Utils;
using System;

namespace Logging.Factory
{
    /// <summary>
    /// 
    /// </summary>
    public class LoggingFactory
    {
        /// <summary>
        /// LogService utilisé pour l'application
        /// </summary>
        private static ILogService instance = null;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public static ILogService GetLogService(ParamLog param)
        {
            if (instance == null)
            {
                String mess = CheckParam(param);
                if (mess == null)
                {
                    switch (param.TypeLog)
                    {
                        case TypeLog.BDD:
                            instance = new LoggingBaseDeDonne(param.NameOrConnectionString);
                            break;
                        case TypeLog.CSV:
                            instance = new LoggingCSV(param.NameApplication, param.PathApplication);
                            break;
                        case TypeLog.TXT:
                            instance = new LoggingTXT(param.NameApplication, param.PathApplication);
                            break;
                        case TypeLog.XML:
                            instance = new LoggingXML(param.NameApplication, param.PathApplication);
                            break;
                    }
                }
                else
                    throw new ParamLogException(mess);
            }

            return instance;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        private static String CheckParam(ParamLog param)
        {
            String messageError = null;

            switch(param.TypeLog)
            {
                case TypeLog.BDD:
                    if(String.IsNullOrWhiteSpace(param.NameOrConnectionString))
                        messageError = "La chaine de connexion ou le nom de la connexion doit être obligatoirement renseignée.";
                    break;

                case TypeLog.CSV:
                    if (String.IsNullOrWhiteSpace(param.NameApplication) ||
                        String.IsNullOrWhiteSpace(param.PathApplication))
                        messageError = "Le nom de l'application ainsi que le chemin de stockage du fichier de log doivent être obligatoirement renseignés.";
                    break;

                case TypeLog.TXT:
                    if (String.IsNullOrWhiteSpace(param.NameApplication) ||
                        String.IsNullOrWhiteSpace(param.PathApplication))
                        messageError = "Le nom de l'application ainsi que le chemin de stockage du fichier de log doivent être obligatoirement renseignés.";
                    break;

                case TypeLog.XML:
                    if (String.IsNullOrWhiteSpace(param.NameApplication) ||
                        String.IsNullOrWhiteSpace(param.PathApplication))
                        messageError = "Le nom de l'application ainsi que le chemin de stockage du fichier de log doivent être obligatoirement renseignés.";
                    break;
            }

            return messageError;
        }

        /// <summary>
        /// 
        /// </summary>
        public static void Dispose()
        {
            instance = null;
        }
    
    }
}
